home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / fdform18.zip / FDREAD.ASM < prev    next >
Assembly Source File  |  1991-07-21  |  25KB  |  477 lines

  1.              page      68,129
  2.  
  3. IFIS286      MACRO     cp,i
  4.              IFIDN     <CP>,</$G+>
  5.              ENDM
  6.  
  7. IFIS88       MACRO     cp,i
  8.              IFIDN     <CP>,</$G->
  9.              ENDM
  10.  
  11.              IFNDEF    CPU
  12.              %out      No CPU defined for Assembly, defaulting to 286
  13. CPU          EQU       </$G+>
  14.              ENDIF
  15.              IFIS286   %CPU
  16.              .286
  17.              ENDIF
  18.              title     fdread - lesen von disketten aller formate
  19.  
  20.              .radix    10
  21.  
  22. startadr     equ       0ff80h
  23.  
  24. cseg         segment   use16 word public 'code'
  25.              assume    cs:cseg,ds:nothing,es:nothing,ss:nothing
  26.  
  27.              org       0
  28.  
  29. lex          equ       offset end_hdr-offset int13_2
  30. lex2         equ       (lex+15)/16
  31. lex3         equ       offset begin-offset start
  32. lex4         equ       (lex3+15)/16
  33.  
  34. int13_2      label     dword                ;HMA Einsprung INT13
  35. int13_2ofs   dw        entry                ;Offset-Teil
  36. int13_2seg   dw        ?                    ;Segment-Teil
  37.  
  38. xms          label     dword                ;Speicher für XMS-Einsprungaddresse
  39. xms_ofs      dw        ?
  40. xms_seg      dw        ?
  41.  
  42.              .286                           ;Der folgende Teil wird nur bei 286+ relevant
  43. int13_1      proc      far                  ;INT-09 Handler
  44.              pusha                          ;Alle Register retten
  45.              mov       ah,7                 ;Code für A20 testen
  46.              call      dword ptr xms        ;Rufe XMS-Manager auf
  47.              dec       ax                   ;Ist A20 enabled (Ja: AX=1)
  48.              jz        ret1                 ;Wenn, ja ist hier alles erledigt
  49.              mov       ah,5                 ;Code für A20 local enablen
  50.              call      dword ptr xms        ;Rufe XMS-Manager auf
  51. ret1:        popa                           ;Alle Register wiederherstellen
  52.              jmp       int13_2              ;Führe den eigentlichen Handler aus
  53. int13_1      endp
  54.  
  55.              .8086
  56.  
  57. end_hdr:
  58.  
  59.              org       startadr
  60.  
  61. start:
  62.  
  63.              IFIS286   %CPU
  64.              even
  65.              .286
  66.              ENDIF
  67.  
  68. old13        label     dword                               ;Speicherung des alten Interrupt 13
  69. old13_ofs    dw        ?                                   ;Offset-Teil
  70. old13_seg    dw        ?                                   ;Segment-Teil
  71. oldsec       db        ?
  72.  
  73. entry        proc      far
  74.              push      ax                                  ;AX retten
  75.              or        ah,ah                               ;Wurde Funktion 0 RESET aufgerufen?
  76.              jz        donothing                           ;Ja, dann Ende
  77.              cmp       ah,4                                ;Wurde Funktion über 4 aufgerufen?
  78.              ja        donothing                           ;Ja, dann Ende
  79.              cmp       dl,3
  80.              ja        donothing
  81.              push      bx                                  ;...Register...
  82.              push      ds                                  ;...retten
  83.              IFIS286   %CPU
  84.              push      0
  85.              ELSE
  86.              xor       bx,bx
  87.              push      bx
  88.              ENDIF
  89.              pop       ds
  90.              lds       bx,ds:[78h]                         ;Disk-Parameter Tabelle in DS:BX
  91.              mov       al,ds:[bx+4]
  92.              mov       oldsec,al
  93.              mov       byte ptr ds:[bx+4],1Bh              ;Setze auf maximal 25 Sektoren/Spur
  94.              IFIS286   %CPU
  95.              or        ch,ch                               ;Track 0 ?
  96.              jz        exit                                ;Ja, dann Ende
  97.              ENDIF
  98.              pop       ds                                  ;Alle...
  99.              pop       bx                                  ;...Register...
  100.              pop       ax                                  ;...zurückholen.
  101.              push      ax                                  ;AX für später speichern
  102.              pushf                                         ;Flags pushen da INT-CALL
  103.              call      old13                               ;Alten INT 13 aufrufen
  104.              IFIS286   %CPU
  105.              jnc       okexit                              ;Kein Fehler, dann Ende
  106.              pop       ax                                  ;Hole uns AX zurück
  107.              push      ds                                  ;Speichere...
  108.              push      bx                                  ;...DS & BX
  109.              push      40h                                 ;BIOS-Data Segment...
  110.              pop       ds                                  ;...nach DS
  111.              mov       bx,90h                              ;Beginn der Drive-Tabelle
  112.              add       bl,dl                               ;Offset des Laufwerks
  113.              cmp       ch,43                               ;Track>43
  114.              ja        nodstep                             ;Ja, dann niemals DSTEP
  115.              xor       byte ptr ds:[bx],20h                ;invertiere das Stepper-Bit
  116.              jmp       short stepend                       ;Ende vom Stepping
  117. nodstep:     and       byte ptr ds:[bx],0dfh               ;Kein Double-Stepping
  118. stepend:     pop       bx                                  ;Hole BX und..
  119.              pop       ds                                  ;...DS zurück
  120.              jmp       short endrout2                      ;Routine zu Ende
  121. exit:        pop       ds                                  ;Hole alle benutzten...
  122.              pop       bx                                  ;...Register...
  123.              pop       ax                                  ;...wieder zurück
  124. endrout2:    pushf
  125. endrout:     call      old13                               ;Springe an den alten Interrupt 13
  126.              push      ax
  127.              ENDIF
  128. okexit:      push      ax
  129.              push      bx
  130.              push      ds
  131.              IFIS286   %CPU
  132.              push      0
  133.              ELSE
  134.              xor       bx,bx
  135.              push      bx
  136.              ENDIF
  137.              pop       ds
  138.              lds       bx,ds:[78h]                         ;Disk-Parameter Tabelle in DS:BX
  139.              mov       al,oldsec
  140.              mov       ds:[bx+4],al
  141.              pop       ds
  142.              pop       bx
  143.              pop       ax
  144.  
  145.              inc       sp                                  ;Werfe den...
  146.              inc       sp                                  ;...gesicherten AX weg
  147.              ret       2                                   ;Und Ende mit original Flags
  148.  
  149. donothing:   pop       ax
  150.              jmp       old13
  151.  
  152. entry        endp
  153.  
  154. begin:
  155.  
  156. cseg         ends
  157.  
  158. iseg         segment   use16 para public 'code'
  159.              assume    cs:iseg,ds:iseg      ;Assembler die...
  160.              assume    es:cseg,ss:sseg      ;...Segment Register mitteilen
  161.  
  162. umbok        dw        ?
  163. loadseg      dw        cseg
  164.  
  165. begin2:
  166.              push      cs                   ;
  167.              pop       ds                   ;DS=CS
  168.              mov       dx,offset texthallo  ;Begruessungstext in DX
  169.              mov       ah,9                 ;Ausgabe...
  170.              int       21h                  ;...über DOS
  171.              mov       ah,30h               ;Hole...
  172.              int       21h                  ;...die DOS-Version
  173.              xchg      ah,al                ;AH und AL vertauschen
  174.              cmp       ax,314h              ;Ist es mindestens DOS 3.20
  175.              jae       versionok            ;Ja, Ok
  176.              mov       dx,offset textdosbad ;Sonst leider Pech
  177.              mov       ah,9                 ;Und Meldung...
  178.              int       21h                  ;...ausgeben
  179.              mov       ax,4c04h             ;Fehlernummer 4
  180.              int       21h                  ;Und Ende
  181.  
  182.              include   cputest.asm
  183.  
  184. versionok:
  185.              IFIS286   %CPU
  186.              call      MachineCheck
  187.              cmp       ax,1
  188.              jnz       cpuok
  189.              mov       dx,offset textlp
  190.              mov       ah,9
  191.              int